import api from './api';
import { User as BaseUser, UserRole } from '@/types';

// 扩展基础用户类型，添加后端特有的字段
export interface User extends Omit<BaseUser, 'createdAt' | 'updatedAt'> {
  enabled: boolean;
  createTime: string; // 后端返回的是字符串格式的日期
  updateTime: string | null;
}

export interface ApiResponse<T> {
  code: number;
  message: string;
  data: T;
}

/**
 * 获取当前用户信息
 * @returns 用户信息
 */
export const getUserProfile = async (): Promise<User> => {
  try {
    console.log('开始获取用户信息');
    const response = await api.get('/users/profile');
    console.log('获取用户信息成功:', response);
    
    // 确保数据格式正确
    const responseData = response.data || response;
    
    const userData = {
      // 确保 id 是字符串类型
      id: String(responseData.id),
      // 基本用户信息
      username: responseData.username || '',
      name: responseData.name || '',
      // 确保角色是 UserRole 枚举类型
      role: mapRoleString(responseData.role),
      // 确保 createTime 和 updateTime 存在
      createTime: responseData.createTime || new Date().toISOString(),
      updateTime: responseData.updateTime || null,
      // 确保其他必需字段存在
      email: responseData.email || '',
      phone: responseData.phone || '',
      avatar: responseData.avatar || null,
      enabled: responseData.enabled !== undefined ? responseData.enabled : true,
    } as User;
    
    return userData;
  } catch (error: any) {
    console.error('获取用户信息失败:', error);
    
    // 处理认证错误
    if (error.isAuthError || (error.response && error.response.status === 401)) {
      console.warn('认证失败，需要重新登录');
      // 不在这里处理重定向，让调用方决定如何处理
    }
    
    throw error;
  }
};

/**
 * 将字符串角色映射为 UserRole 枚举
 */
function mapRoleString(role: string): UserRole {
  switch (role?.toUpperCase()) {
    case 'ADMIN':
      return UserRole.ADMIN;
    case 'TEACHER':
      return UserRole.TEACHER;
    case 'PARENT':
      return UserRole.PARENT;
    default:
      return UserRole.PARENT; // 默认为家长角色
  }
}

/**
 * 更新用户信息
 * @param userData 用户数据
 * @returns 更新后的用户信息
 */
export const updateUserProfile = async (userData: Partial<User>): Promise<User> => {
  try {
    const response = await api.put<any>('/users/profile', userData);
    const responseData = response.data || response;
    
    return {
      id: String(responseData.id),
      username: responseData.username || '',
      name: responseData.name || '',
      role: mapRoleString(responseData.role),
      createTime: responseData.createTime || new Date().toISOString(),
      updateTime: responseData.updateTime || null,
      email: responseData.email || '',
      phone: responseData.phone || '',
      avatar: responseData.avatar || null,
      enabled: responseData.enabled !== undefined ? responseData.enabled : true,
    } as User;
  } catch (error) {
    console.error('更新用户信息失败:', error);
    throw error;
  }
};

/**
 * 修改用户密码
 * @param oldPassword 旧密码
 * @param newPassword 新密码
 * @returns 是否成功
 */
export const updateUserPassword = async (oldPassword: string, newPassword: string): Promise<boolean> => {
  try {
    console.log('开始修改密码');
    const response = await api.put('/users/password', {
      oldPassword,
      newPassword
    });
    
    // 完整打印响应信息
    console.log('密码修改响应(完整):', response);
    
    // 处理新的响应格式
    const responseData = response.data || response;
    
    // 不管状态码，只要有成功消息就认为成功
    if (responseData && 
        (responseData.message === '密码修改成功' || 
         responseData.status === 'success' ||
         responseData.code === 200)) {
      console.log('密码修改判定为成功');
      return true;
    }
    
    console.log('密码修改判定为失败');
    return false;
  } catch (error: any) {
    // 完整打印错误信息
    console.error('修改密码失败(完整错误):', error);
    
    // 处理服务器错误
    if (error.response && error.response.status === 500) {
      console.warn('服务器内部错误，但密码可能已修改成功');
      // 某些情况下，即使返回500错误，密码也可能已经修改成功
      return true;
    }
    
    // 抛出错误，让调用方处理
    throw error;
  }
};

/**
 * 上传用户头像
 * @param file 头像文件
 * @returns 头像URL
 */
export const uploadAvatar = async (file: File): Promise<string | null> => {
  try {
    // 创建 FormData 对象
    const formData = new FormData();
    formData.append('file', file);
    
    // 发送请求
    const response = await api.post('/users/avatar', formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    });
    
    // 返回头像URL
    const responseData = response.data || response;
    return responseData.url || responseData.avatar || null;
  } catch (error: any) {
    console.error('上传头像失败:', error);
    
    // 处理认证错误
    if (error.isAuthError || (error.response && error.response.status === 401)) {
      console.warn('认证失败，需要重新登录');
      // 不在这里处理重定向，让调用方决定如何处理
    }
    
    throw error;
  }
}; 